package final_wearebatman_model;

import java.util.LinkedList;

//a vezetékeket implementáló osztály
public class Wire implements Ioperable {

    private int inPin, outPin;
    private IhasInput in;
    private IhasOutput out;
    private String name;
    private LinkedList<Wire> wires;

    //konstruktor
    public Wire(String name) {
        this.name = name;
        this.wires = new LinkedList<Wire>();       
    }

    //vezeték összekötése más elemmel
    public void connect(IhasOutput out, int outIndex, IhasInput in, int inIndex) {
        // Logic
        this.inPin = inIndex;
        this.outPin = outIndex;
        this.in = in;
        this.out = out;
        out.connectWireOutput(inIndex, this);
        in.connectWireInput(outIndex, this);       
    }

    //vezeték összekötése más elemmel
    public void connect(Wire wire, IhasInput in, int inIndex) {
        this.inPin = inIndex;
        this.outPin = wire.outPin;
        this.in = in;
        this.out = wire.out;
        in.connectWireInput(inIndex, this);

        wire.addWire(this);       
    }

    //új vezeték hozzáadása
    public void addWire(Wire w) {
        this.wires.add(w);
    }

    //a vezeték csak viszi a jelet, ez a metódus ezt implementálja
    public void operate() {
        in.setInputData(inPin, out.getOutputData(outPin));        
        if (!this.wires.isEmpty()) {
            for (int i = 0; i < this.wires.size(); i++) {               
                this.wires.get(i).operate();
            }
        }
        in.operate();
    }

    //név lekérése
    public String getName() {
        return this.name;
    }

    //számláló nullázása
    public void resetCounter() {
        
    }

    //végső állapot
    public String getFinalState() {
        return Integer.toString(this.in.getInputData(0));
    }
}
